// promise
// 一种更优的异步编程统一方案
// 有效避免地域问题
// 对象，用来表示异步任务完成后是成功还是失败

//   Promise 基本用法

// const promise = new Promise(function(resolve, reject) {
//     // 兑现承诺
//     // resolve(100) // 承诺达成
//     reject(new Error('promise reject')) // 承诺失败
// })

// promise.then(function (value) {
//     console.log('resolve', value)
// }, function(error) {
//     console.log('rejected', error)
// })

function ajax (url) {
    return new Promise(function (resolve, reject) {
        var xhr = new XMLHttpRequest()
        xhr.open('GET', url)
        xhr.responseType = 'json'
        xhr.onload = function () {
            if (this.status === 200) {
                resolve(this.response)
            } else {
                reject(new Error(this.statusText))
            }
        }
        xhr.send()
    })
}

// ajax('/api/users.json').then(function(res) {
//     console.log(res)
// }).catch(function(err) {
//     console.log(err)
// })

// Promise 误区
// 嵌套使用的方式是Promise常见误区
// 应尽量保持Promise扁平化操作

// Promise 链式调用


// var promise = ajax('/api/users.json')
// var promise2 = promise.then(
//     function onFulfilled(value) {
//         console.log('onFulfilled', value)
//     },
//     function onRejected (error) {
//         console.log('onRejected', error)
//     }
// )

// console.log(promise2)
// 每一个then方法实际上都是为上一个then方法添加回调
// ajax('/api/users.json')
//     .then(function(value) {
//         console.log(11111)
//         return ajax('/api/urls.json')
//     })
//     .then(function(value) {
//         console.log(22222)
//         // return ajax('/api/urls.json')
//     })   
//     .then(function(value) {
//         console.log(3333)
//         console.log(value)
//         return ajax('/api/urls.json')
//     })    
//     .then(function(value) {
//         console.log(4444)
//         console.log(value)
//         return 'foo'
//     })    
//     .then(function(value) {
//         console.log(5555)
//         console.log(value)
//     })

// Promise 异常处理

// ajax('/api/users.json')
//     .then(
//         function onFulfilled(value) {
//             console.log('onFulfilled', value)
//             return ajax('/error')
//         },
//         function onRejected (error) {
//             console.log('onRejected', error)
//         }
//     )

// ajax('/api/users11.json')
//     .then(function onFulfilled(value) {
//         console.log('onFulfilled', value)
//         return ajax('/api/users.json')
//     })
//     .catch(function onRejected (error) {
//         console.log('onRejected', error)
//     })
//     .then(function onFulfilled(value) {
//         console.log('onFulfilled2', value)
//     })
//     .catch(function onRejected (error) {
//         console.log('onRejected2', error)
//     })


// Promise 静态方法
// Promise.resolve   Promise.reject

// Promise.resolve('foo')
//     .then(function (value) {
//         console.log(value)
//     })
// // =====等价于
// new Promise(function (resolve, reject) {
//     resolve('foo')
// })

// 用promise对象包装一个promise对象就等于原本的promise
// var promise = ajax('/api/users.json')
// var promise2 = Promise.resolve(promise)
// console.log(promise === promise2)

// Promise.resolve({
//     then: function(onFulfilled, onRejected) {
//         onFulfilled('foo')
//     }
// })
// .then(function(value) {
//     console.log(value)
// })

// Promise.reject(new Error('rejected'))
//     .catch(function(err) {
//         console.log(err)
//     })